// 信号量实现 生产者 消费者
// 教学实验中心 liangzhu
// 编译环境 linux gc++
// 编译:g++ -std=c++11 prod.cpp -lpthread
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>

#define NUM 10                              //最大缓冲区属
int queue[NUM];	
sem_t blank_number, product_number;			//空闲空间信号量, 产品信号量
void *producer(void *arg){
        int i = 0;
        while (1) {
                sem_wait(&blank_number);        //p 操作 生产者将空格子数--,为 0 则阻塞等待
                queue[i] = rand() % 1000 + 1;       //生产一个产品
                printf("生产者:产品%d 置于空间[%d]\n", queue[i],i);
                sem_post(&product_number);//v 操作 将产品数++
                i = (i+1) % NUM;                            //借助下标实现环形
                usleep(rand()%1000000);
        }
}
void *consumer(void *arg){
        int i = 0;
        while (1) {
                sem_wait(&product_number);//消费者将产品数--,为 0 则阻塞等待
                printf(" --- 消费者:取出产品%d 从空间[%d]\n", queue[i],i);
                queue[i] = 0;//消费一个产品
                sem_post(&blank_number);//消费掉以后,将空闲空间数++
                i = (i+1) % NUM;
                usleep(rand()%1000000);
        }
}

int main(int argc, char *argv[]){
        srand((unsigned)time(NULL));
        for(int i=0;i<=10;i++)  printf("%d ",rand()%100);
        pthread_t pid, cid;
        sem_init(&blank_number, 0, NUM);//初始化空闲空间信号量为 10
        sem_init(&product_number, 0, 0);//产品数为 0
        pthread_create(&pid, NULL, producer, NULL);
        pthread_create(&cid, NULL, consumer, NULL);
        pthread_join(pid, NULL);
        pthread_join(cid, NULL);
        sem_destroy(&blank_number);
        sem_destroy(&product_number);
        return 0;
}